<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <!-- 导入 layui 的样式 -->
    <link rel="stylesheet" href="../assets/lib/layui/css/layui.css" />
    <style>
        /* 设置盒子全局样式 */
        html,
        body {
            margin: 0;
            padding: 0;
        }

        body {
            padding: 15px;
            background-color: #f2f3f5;
        }

        .layui-form {
            width: 500px;
        }

        .layui-card-header {
            display: flex;
            justify-content: space-between;
            align-items: center;
        }
    </style>

</head>

<body>


    <!-- 卡片区域 -->
    <div class="layui-card">
        <div class="layui-card-header">文章列表</div>
        <div class="layui-card-body">
            <!-- 筛选区 -->
            <form class="layui-form" id="form-search">
                <!-- 文章分类筛选 -->
                <div class="layui-form-item layui-inline">
                    <select name="cate_id"></select>
                </div>
                <div class="layui-form-item layui-inline">
                    <select name="state">
                        <option value="">所有状态</option>
                        <option value="已发布">已发布</option>
                        <option value="草稿">草稿</option>
                    </select>
                </div>
                <!-- 文章状态刷选 -->
                <div class="layui-form-item layui-inline">
                    <button class="layui-btn " lay-submit lay-filter="formDemo" id="form-search">筛选</button>
                </div>
            </form>


            <!-- 列表区 -->
            <table class="layui-table">
                <colgroup>
                    <col />
                    <col width="150" />
                    <col width="180" />
                    <col width="150" />
                    <col width="150" />
                </colgroup>
                <thead>
                    <tr>
                        <th>文章标题</th>
                        <th>分类</th>
                        <th>发表时间</th>
                        <th>状态</th>
                        <th>操作</th>
                    </tr>
                </thead>
                <tbody></tbody>
            </table>


            <!-- 分页区 -->
        </div>
    </div>
    </div>

</body>
<script src="../assets/lib/layui/layui.all.js"></script>
<!-- 导入jquery -->
<script src="../assets/lib/jquery.js"></script>
<!-- 导入baseapi -->
<script src="../assets/js/mybaseAPI.js"></script>
<!--发哦如template -->
<script src="../assets/lib/template-web.js"></script>
<!-- 导入moment。js -->
<script src="../assets/lib/moment.js"></script>
<script>
    // 1. 定义一个查询的参数对象，将来请求数据的时候，
    // 需要将请求参数对象提交到服务器
    let searchListObj = {
        pagenum: 1, // 页码值，默认请求第一页的数据
        pagesize: 2, // 每页显示几条数据，默认每页显示2条
        cate_id: '', // 文章分类的 Id
        state: '' // 文章的发布状态
    }



    // 1 获取文章列表数据方法
    initTable()
    // 2.2  获取文字分类列表
    initCate()
    // 监听表单的提交事件
    // 4. 为筛选表单按钮绑定 submit 事件
    $('#form-search').on('submit', function (e) {
        // 4.1 取消默认提交事件
        e.preventDefault()
        // 4.2 获取表单中选中项的值
        let cate_id = $('[name=cate_id]').val()
        let state = $('[name=state]').val()
        // 4.3 为查询参数对象 searchListObj 中对应的属性赋值,在调用接口之前，将公共的分页参数进行修改
        searchListObj.cate_id = cate_id
        searchListObj.state = state
        // 4.4 根据最新的筛选条件，重新渲染表格的数据
        initTable()
    })
    // 建立分页方法
    let laypage = layui.laypage
    // 定义渲染分页的方法
    function renderPage(total) {
        // 调用 laypage.render() 方法来渲染分页的结构
        laypage.render({
            elem: 'pageBox', // 分页容器的 Id
            count: total, // 总数据条数
            limit: searchListObj.pagesize, // 每页显示几条数据
            curr: searchListObj.pagenum, // 设置默认被选中的分页
            layout: ['count', 'limit', 'prev', 'page', 'next', 'skip'], // 按顺序展示内容
            limits: [2, 3, 5, 10], // 每页展示多少条
            jump: function (obj, first) {
                // 5.2 把最新的页码值，赋值到 searchListObj 这个查询参数对象中.obj包含了所有分页的参数
                searchListObj.pagenum = obj.curr
                // 5.2 把最新的条目数，赋值到 searchListObj 这个查询参数对象的 pagesize 属性中
                searchListObj.pagesize = obj.limit
                // 5.3 根据最新的 searchListObj 获取对应的数据列表，并渲染表格
                if (!first) {
                    initTable()
                }
            }
        })
    }

    // 获取文章列表数据的方法
    function initTable() {
        $.ajax({
            method: 'GET',
            url: '/my/article/list',
            data: searchListObj,
            success: function (res) {
                if (res.status !== 0) {
                    return layer.msg('获取文章列表失败！')
                }
                // 2.1 使用模板引擎渲染页面的数据
                let htmlStr = template('tpl-table', res)
                $('tbody').html(htmlStr)
            }
        })
    }
    // 1 获取文章类别列表方法
    let form = layui.form


    //2.1 初始化文章分类的方法
    function initCate() {
        $.ajax({
            method: 'GET',
            url: '/my/article/cates',
            success: function (res) {
                if (res.status !== 0) {
                    return layer.msg('获取分类数据失败！')
                }
                // 3.1 调用模板引擎渲染分类的可选项
                let htmlStr = template('tpl-cate', res)
                $('[name=cate_id]').html(htmlStr)
                // 3.2 通过 layui form方法 重新渲染表单区域的UI结构
                // 调用渲染分页的方法
                renderPage(res.total)
            }
        })
    }


    //1.3 定义美化时间的过滤器
    // template.defaults.imports 是模板引擎自定义方法的一种方式
    template.defaults.imports.dataFormat = function (date) {
        // format()方法定义了输出的时间字符串格式
        moment(date).format('YYYY-MM-DD hh:mm:ss')
    }

    console.log('===========================');
    // 4  实现删除文章的功能
    // 6. 通过代理的形式，为删除按钮绑定点击事件处理函数
    $('tbody').on('click', '.btn-delete', function () {
        // 6.1 获取删除按钮的个数
        let len = $('.btn-delete').length
        // console.log(len)
        // 6.2 获取到文章的 id
        let id = $(this).attr('data-id')
        // 6.3 询问用户是否要删除数据
        layer.confirm('确认删除?', {
            icon: 3,
            title: '提示'
        }, function (index) {
            // 6.4 确认后调用删除接口
            $.ajax({
                method: 'GET',
                url: '/my/article/delete/' + id,
                success: function (res) {
                    if (res.status !== 0) {
                        return layer.msg('删除文章失败！')
                    }
                    layer.msg('删除文章成功！')
                    // 6.5 当数据删除完成后，需要判断当前这一页中，是否还有剩余的数据
                    // 如果没有剩余的数据了,则让页码值 -1 之后,
                    // 再重新调用 initTable 方法
                    if (len === 1) {
                        // 如果 len 的值等于1，证明删除完毕之后，页面上就没有任何数据了
                        // 页码值最小必须是 1
                        searchListObj.pagenum = searchListObj.pagenum === 1 ? 1 :
                            searchListObj.pagenum - 1
                    }

                    // 6.6 重新渲染表格数据
                    initTable()
                }
            })
            // 6.7 关闭弹框
            layer.close(index)
        })
    })












    console.log('==========================================');
</script>
<!-- 定义文章列表模板结构 -->
<script type="text/html" id="tpl-table">
    {{each data}}
    <tr>
        <td>{{$value.title}}</td>
        <td>{{$value.cate_name}}</td>
        <td>{{$value.pub_date}}</td>
        <td>{{$value.state}}</td>
        <td>
            <button type="button" class="layui-btn layui-btn-danger layui-btn-xs btn-delete"
                data-id="{{$value.Id}}">删除</button>
        </td>
    </tr>
    {{/each}}
</script>

<!-- 文章类别下拉模板 -->
<!-- 分类可选项的模板结构 -->
<script type="text/html" id="tpl-cate">
    <option value="">所有分类</option>
    {{each data}}
    <option value="{{$value.Id}}">{{$value.name}}</option>
    {{/each}}
</script>

</html>